JSON en .NET Core
JSON staat voor JavaScript Object Notation: het is een op JavaScript gebaseerde manier om gegevens weer te geven en op te slaan. Douglas Crockford, de bedenker ervan, vond dat XML te ingewikkeld was en stelde een eenvoudiger manier om data uit te wisselen voor dat dichter stond bij de manier waarop objecten in JavaScript werden voorgesteld.
De gegevens worden in JSON opgeslagen als data-paren, te weten variabele:waarde
. De naam en de waarde binnen een data-paar worden gescheiden door een dubbele punt.
Dit alles wordt achter elkaar in een string gezet, gescheiden door komma's.
Je kunt de JSON notatie gebruiken om:
- complexe datastucturen uit te wisselen tussen programma's en computers, bijvoorbeeld formulier-informatie tussen de server en de gebruikers-PC;
- data op te slaan in je eigen browser, bijvoorbeeld in local storage;
Doestelling
Na deze les kan je JSON manipuleren in C#.
Als voorbeeld nemen we de Postcodes. We lezen de postcodes in uit het csv bestand in een array en we serialiseren vervolgens de array als JSON. Tenslotte lezen we het JSON bestand in en zetten de JSON om naar een List
.
Bronnen
- Suresh Dasari, Convert List Object to JSON String in C#, VB.NET, Feb 2, 2017
- Newtonsoft.Json
Newtonsoft.Json installeren
- Ik ga ervan uit dat je op je lokale computer een werkmap voor de module hebt gemaakt (in de trant van Programmeren5-15227 of Programmeren3-15268 of gewoon Programmeren3). Hangt ervan af in welke module dit toegepast wordt.
- Ik ga er ook vanuit dat je .NET Core reeds geactiveerd hebt. Indien niet ga je eerst naar Programmeren in Visual Studio.
- Daarnaast heb je reeds een project learning aangemaakt, indien niet ga je naar Oefening OO code schrijven. Daar zie je hoe je een learning project creëert.
- Het
Newtonsoft.Json
pakket installeren. Hoe je dat doet vind je op de Newtonsoft.Json pagina. We gaan de JSON serializer installeren met behulp van NuGet.- De NuGet Package Manager Console openen:
- De serializer installeren met de instructie Install-Package Newtonsoft.Json -Version 10.0.3:
- Voeg de methode
SerializeCsvToJson
toe aan de klasseTryOut
in de namespaceDotNetCore.Learning
in het klassenbestand met de naam Learning.cs.om een bestand te genereren met de postcodes in JSON formaat:public static void SerializeCsvToJson() { Postcode postcode = new Postcode(); TextWriter writer = new StreamWriter(@"Data/Postcode.json"); //De serializer werkt niet voor een generieke lijst en ook niet voor ArrayList List<Postcode> postcodeList = GetPostcodeList(); // static method SerilizeObject van Newtonsoft.Json string postcodeString = Newtonsoft.Json.JsonConvert.SerializeObject(postcodeList); writer.WriteLine(postcodeString); writer.Close(); }
- We maken nu een presentatie methode om de postcodes in de console te tonen. Voeg de volgende methode toe aan de klasse
TryOut
in de namespaceDotNetCore.Learning
in het bestand met de naam Learning.cs (dat is dezelfde methode als voor de postcodes die we uit een XML bestand lezen (XML en .NET Core).public static void ListPostcodes(List<Postcode> list) { foreach (Postcode postcode in list) { // One of the most versatile and useful additions to the C# language in version 6 // is the null conditional operator ?.Post Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", postcode?.Code, postcode?.Plaats, postcode?.Provincie, postcode?.Localite, postcode?.Province); } }
- En nu nog een methode om de postcodes om te zetten van JSON formaat naar een
List
metPostcode
objecten. Voeg de methodeGetPostcodeListFromJson
toe aan de klasseTryOut
in de namespaceDotNetCore.Learning
in het klassenbestand met de naam Learning.cs:public static List<Postcode> GetPostcodeListFromJson() { Helpers.Tekstbestand bestand = new Helpers.Tekstbestand(); bestand.FileName = @"Data/Postcode.json"; bestand.Lees(); List<Postcode> list = JsonConvert.DeserializeObject<List<Postcode>>(bestand.Text); return list; }
- Probeer de methoden uit in de
Main
functie van Program.cs:using System; namespace DotNetCore.Learning { class Program { static void Main(string[] args) { TryOut.ListPostcodes(TryOut.GetPostcodeListFromJson()); Console.ReadKey(); } } }
- En dat is het resultaat:
- Wijzigingen opslaan in de repo op Bitbucke
-
Er rest ons alleen nog de wijzigingen te sturen naar onze repo op Cloud9. Let erop dat ik in de voorbeelden een andere naam kan gebruiken. Ik gebruik dit lesmateriaal immers in meerdere modules.
Daarvoor voeren we de volgende stappen uit:
- ga naar het commando venster of naar PowerShell;
- ga naar de de map waar je project staat, we pushen immers het hele project en niet alleen de dotnetcore map (de naam van de map hangt af van de module die je aan het volgen bent):
cd "C:\Users\jefin\OneDrive\school 2017-2018\Programmeren3-15268"
- Voeg de volgende mappen en bestand toe in het .gitignore bestand:
dotnetcore/hwapp/bin/ dotnetcore/hwapp/obj/ dotnetcore/adodotnet/adodotnet/obj/ dotnetcore/adodotnet/adodotnet/bin/Debug/ dotnetcore/adodotnet/adodotnet/obj/Debug/ dotnetcore/adodotnet/adodotnet.sln dotnetcore/adodotnet/adodotnet/.vs/ dotnetcore/.vs/ dotnetcore/learning/bin/ dotnetcore/learning/obj/ dotnetcore/*.sln
- check de gewijzigde bestanden:
git status
- we merken dat er VS nieuwe bestanden heeft gemaakt die we niet in de repo willen, dus wijzigen we het .gitignore bestand;
- met git
rm -rf --cached .
activeren we het nieuwe .gitignore bestand (VS verzameld automatisch bestanden) - opnieuw
git status
- verzamel de gewijzigde bestanden op de verzamelplaats:
git add --all
- check welke bestanden verzameld zijn:
git status
- leg ze neer en voeg er commentaar aan toe:
git commit -m "Newtonsoft.Json toegevoegd en uitgetest."
- verifiëer als je al een alias voor Bitbucket url hebt toegevoegd:
git remote -v
- Indien nodig voeg je een alias toe voor de Bitbucket url:
git remote add origin https://JefInghelbrecht@bitbucket.org/JefInghelbrecht/programmeren-3.git
- verstuur de neergelegde wijzigingen naar BitBucket:
git push -u origin master
- Als je repo's niet meer gesynchroniseerd zijn omdat dit de eerste keer is dag je dit doet, kan je de push forceren met de
-f
flag:
git
push -f origin master
. -
check op Bitbucket als de repo bijgewerkt is
-